//---------------------------------------------------------------------------

#ifndef BoardsH
#define BoardsH
#include "Boards.h"
#include "History.h"
#include <cmath>
#include <ctime>
#include <cstdlib>
#include "Coin.h"
#include<iostream>
#include <vector>
using namespace std;
 class Boards{

	private:
	int boardSize; // 8 atau 10
	int **area;
	 

	 Coin *myCoin;
	public :
	int boardMaxIdx;
	int boardMinIdx;
	int coinMinIdx;
	int coinMaxIdx;
	int secondCoinStartIdx;
	Boards();
	Coin* allCoin();
	void initArea();
	void initBoards(int boards);
	void initCoin();
	void fillArea();
	void printArea(int** mArea);
	void playGame();
	void initGame();
	void moveCoin();
	void gameLoop();
	void moveCoinTo(int currentCoin, int moveTo); // menggerakkan coin ke suatu arah
	void refresh();
	void coinMoveLeftUp(int coin);
	void coinMoveLeftDown(int coin);
	void coinMoveRightUp(int coin);
	void coinMoveRightDown(int coin);
	bool existCoinLeftUp(int coin);
	bool existCoinLeftDown(int coin);
	bool existCoinRightUp(int coin);
	bool existCoinRightDown(int coin);
	bool passLeftUp(int coin);
	bool passLeftDown(int coin);
	bool passRightUp(int coin);	
	bool passRightDown(int coin);
	Coin getCoin(int coin);
	int checkArea(int coin);
	bool isLeftSide(int coin);
	bool isRightSide(int coin);
	bool isUpSide(int coin);
	bool isDownSide(int coin);
	
	void printCoin(); // print map berdasarkan letak koin
	int getType(int coin); // mendapatkan tipe coin apakah lawan atau teman
	int getCoinNumberFromArea(int x, int y); // mendapatkan nomor coin dari suatu area
	bool isPassAble(int coin, int dir); // mengecek apakah arah yang dimasukkan bisa dilewati atau tidak
	bool isPassAble(int coin); // mengecek apakah arah yang dimasukkan bisa dilewati atau tidak
	bool isForceEnemy(int turn); // jika ada coin yang sedang berhadapan dengan lawan
	void enemyBlast(int coin);
	bool stillForceEnemy(int coin);
	void passCoinTo(int currentCoin, int moveTo);
	int frontKiller(int turn); // memutuskan memilih coin yang paling depan
	int frontPassKill(int currentCoin); // memutuskan memakan lawan yang paling depan dan samping
	int sideCoin(int turn); // pilihan coin yang paling samping
	int sideMove(int currentCoin); // pilihan gerakan yang paling samping
	
	bool ableToMove(int coin, int side); // mengembalikan true jika boleh melangkah
	bool ableToMove(int coin); // mengembalikan true jika boleh melangkah
	int anyWhereCanMove(int coin); // mengembalikan arah kemanapun dia bisa melangkah
	bool moreChanceToKill(int currentCoin);
	bool moreChanceToMove(int currentCoin);
	bool corner(int coin, int id); // mengecek apakah coin berada di sudut
	bool mustEat(coin);
	
	//virtual
	int** copyVirtualArea();
	Coin* copyVirtualCoin();
	void passCoinTo(int** mArea, Coin* mCoin, int coin, int moveTo);
	int checkArea(int** mArea, Coin* mCoin, int coin);
	bool isPassAble(int** mArea, Coin* mCoin, int coin, int dir); // mengecek apakah arah yang dimasukkan bisa dilewati atau tidak
	bool isPassAble(int** mArea, Coin* mCoin, int coin); // mengecek apakah arah yang dimasukkan bisa dilewati atau tidak
	bool existCoin(int** mArea, Coin*mCoin, int coin, int dir);
	int getCoinNumberFromArea(int** mArea, Coin*mCoin, int x, int y); // mendapatkan nomor coin dari suatu area
	int killOneByOne(int**mArea, Coin* mCoin, int coin, int jabatan);
	
	void setCoin(Coin*);
	
	// Prosedur untuk Greedy level 1
	int furthestCoinToMove(int);
	int leftMove(int coin);
	int shortestDistanceToKill(int coin);
	
	//Prosedur untuk Greedy level 2
	bool safeMove(int );
	bool safeMove(int , int);
	int howStrongToKill(int coin);
	int checkArea(int x, int y);
	int coinMostKill(int turn); // mencari bidak yang paling banyak dapat memakan lawan
	int moveMostKill(int coin);
	int safeCoinToMove(int);
	int mostSafeMove(int coin);
	int shortestSafeDistance(int coin);
	
	//Prosedur untuk Greedy level 3
	int furthestCoinToKill(int turn);
	int leftKill(int coin);
	
	int remainingCoin(int turn);
	bool noCoinCanMove(int turn);
	
	
};
//---------------------------------------------------------------------------
#endif
